תרגול מספר 7 סריקה לעומק, מיון טופולוגי, רכיבים קשירים היטב DFS() 1 For each vertex u V[ ] 2 color[ WHITE 3 [ NIL 4 time 0 5 For each vertex u V[ ] 6 If color[ WHITEthen 7 DFS-VISIT( u ) DFS-VISIT(u) 1 color[ RAY 2 time time 1 3 d[ time 4 For each vertex v Adj[u ] 5 If color[ v] WHITE then 6 [ v] u 7 DFS-VISIT( v ) 8 color[ BLACK 9 f [ time time 1 TOPOLOICAL-SORT() 1 Call DFS() to compute finishing times fv [] for each vertex v. 2 If no bac edge has been discovered during the DFS procedure, then return v i,..., v 1 in where f [ vi 1 ]... f [ v in ]. 3 Else return is a cyclic graph!. תזכורת: סריקת DFS על גרף מכוון מסווגת את קשתות הגרף לקשתות עץ, אחורה, קדימה וחוצות. סריקת DFS על גרף לא מכוון מסווגת את קשתות הגרף לקשתות עץ וקשתות אחורה. v, v V תרגיל לחימום: נתון גרף מכוון E) ( V, וקודקוד הקודקוד האחרון במיון. מה ניתן לומר על v? שבכל כך מיון טופולוגי של קודקודי הגרף הוא ב-. ל- v קיים מסלול מ- u, u V ב-. ל- u לא קיים מסלול מ- v, u V תשובה: לכל א. לכל ב. 1 הוכחה: א. ב. נניח בשלילה כי קיים קודקוד u כך שאין מסלול מ- u ל- v ב-. נתבונן במיון טופולוגי המבוסס על סריקת DFS המתחילה ב- u. בסריקה זו u יצבע בשחור לפני גילוי v, ובפרט [u f [ ולכן u יופיע לאחר v במיון הטופול וגי- לפני צביעת v בשחור, כלומר v] f [ סתירה. v ל- u ב-. נתבונן במיון טופולוגי u כך שיש מסלול מ- נניח בשלילה כי קיים קודקוד v u יצבע בשחור לפני צביעת DFS המתחילה ב- v. בסריקה זו המבוסס על סריקת ולכן u יופיע לאחר v במיון הטופולוגי- סתירה. [u f [ בשחור, כלומר v] f [
בעיית הכיתה המופרעת:. לכל תלמיד קיימת קבוצה בכיתה מסוימת נוהגים התלמידים להשליך מטוסי נייר אחד על השני, ולא רוצה להסתבך )משאר התלמידים הוא מפחד עליהם הוא משליך מטוסים של תלמידים איתם(, במידה והשורה בה יושב התלמיד המשליך רחוקה יותר מהלוח מאשר השורה בה יושבת מטרתו או ששניהם יושבים באותה השורה. של תלמידי הכיתה הוא הושבה של התלמידים באופן כזה בו אף מטוס לא יושלך סידור חוקי במהלך השיעור. סידור אופטימאלי הוא סידור חוקי בעל מספר מינימאלי של שורות. הערה: ניתן להניח ששורות הכיתה אינן מוגבלות במספר מקומות ישיבה. בהינתן מופע לבעיה, נרצה לענות על שתי השאלות: האם קיים סידור חוקי של תלמידי הכיתה? )בעיית החוקיות, או פיסיביליות( במידה וקיים סידור חוקי, מהו הסידור האופטימאלי? )בעיית האופטימיזציה( הציעו אלגוריתם לפתרון בעיית קיום סידור חוקי, ובעיית מציאת סידור אופטימאלי. את בעיה זו נפתור ע"י שימוש במושגים מתורת הגרפים. נתאר את הכיתה על ידי הגרף המכוון (E, (,V כאשר וקיימת צלע )מכוונת( V ( u, v) E היא קבוצת ה תלמידים בכיתה, אם התלמיד u ישליך מטוסים על ה תלמיד v )במידה ו- v ישב, לפני u או באותה השורה שלו(. הבהרה: נשתמש באותם השמות עבור תלמידים וקודקודים המתאים לתלמיד x. כאשר קודקוד x הוא הקודקוד פתרון בעיית קיום סידור חוקי: נריץ את האלגוריתם למיון טופולוגי על. אם ניתן למיין את קודקודי, אזי התשובה לבעיה היא "כן", אחרת התשובה היא "לא". הוכחת נכונות הפתרון: אם ניתן למיין את קודקודי לפי מיון טופולוגי, אזי נושיב את תלמדי הכיתה באופן הבא: בכל שורה ישב תלמיד יחיד, כך שבשורה הראשונה מהלוח ישב התלמיד המיוצג ע "י הקודקוד הראשון במיון, בשורה השנייה מהלוח התלמיד המיוצג ע "י הקודקוד השני במיון, וכן הלאה. אם תלמיד א' יכול לזרוק מטוס על תלמיד ב ', אזי קיימת צלע מכוונת בגרף מקודקוד א ' לעבר קודקוד ב ', ולכן קודקוד א ' מופיע במיון לפני קודקוד ב ', ומכאן תלמיד א' ישב לפני תלמיד ב' ולא יוכל לזרוק עליו מטוסים. אם לא קיים מיון טופולוגי, אזי בהכרח קיים מעגל בגרף, נסמנו ב -. C נניח בשלילה כי ניתן להושיב את התלמידים כך שלא v, v ) 1 i ( v, ) ( i i 1 v1 יזרקו מטוסים אחד על השני. התלמיד v i חייב לשבת לפני התלמיד v i 1 1 i )אחרת ישליך עליו מטוסים(. אך - v 1 סתירה. חייב לשבת לפני עבור כל 2
פתרון בעיית האופטימיזציה: נריץ את האלגוריתם למיון טופולוגי על. במידה וקיים מיון טופולוגי לקודקודי הגרף, נושיב את התלמידים באופן הבא: נאתחל line[ v] 1 לכל קודקוד v בגרף. הוכחת נכונות: נעבור על כל קודקוד v בגרף לפי סדר ההופעה במיון ונבצע:. max{, line[ v] 1} נעדכן ( v, u) E לכל סיום: נושיב כל תלמיד הקרובה ללוח(. בשורה x line[ x] )כאשר השורות נספרות החל מהשורה טענה עיקרית: הסידור המוחזר ע"י האלגוריתם הוא סידור חוקי בעל מספר שורות מינימאלי. v יכול לזרוק מטוסים על תלמיד הוכחת חוקיות הפתרון: כדי להראות שהפתרון המוחזר חוקי, עלינו להראות שאם תלמיד u. לפני תלמיד v אזי הושבנו את תלמיד u, 1: אבחנה נבחנת צלע האלגוריתם יכול לעדכן את ערך השדה עבור קודקוד u ( vu, ) הנכנסת ל-,u לפני u בסידור הטופולוגי לא יתבצעו שינוים בערך השדה מ- u בסידור הטופולוגי לא יוצאות צלעות ל- u(. כלשהו רק כאשר ולכן לאחר שהאלגוריתם יעבור על כל הקודקודים המופיעים )כיוון שמכל הקודקודים החל אבחנה 2: כל שינוי בערך השדה עבור קודקוד u כלשהו יכול רק להגדיל את ערכו. הוכחת החוקיות: יהיו v,u שני תלמידים. נשים לב כי אם תלמיד v יכול לזרוק מטוסים על תלמיד u, אזי קיימת בגרף צלע ), vu (, ולכן קודקוד v מופיע במיון לפני קודקוד u. לפי אבחנה 1, לאחר שהאלגוריתם יבחן את כל הקודקודים המופיעים לפני בנוסף, בשלב בחינת v השדה יכול רק לגדול חוקי. line[] v במיון, ערך השדה v יקבל ערך של לפחות יישאר קבוע.,line[ [v 1 ולפי אבחנה 2 ערך זה. הוכחת אופטימאליות הפתרון: לכן בהכרח בסיום ריצת האלגוריתם v], line[ והסידור המוחזר אכן. line[] טענת עזר: לכל תלמיד v, ולכל פתרון חוקי המושיב את תלמיד v בשורה l מתקיים v l הוכחת האופטימאליות : יהי L מספר השורות בהן הושיב האלגוריתם את ה תלמידים, ויהי v line[. לפי טענת העזר, עבור כל סידור חוקי בו יושב v בשורה l כלשהי, v] תלמיד המקיים L. L מכך עולה כי בכל סידור חוקי התלמידים יושבים בלכל הפחות L שורות, ולכן מתקיים l האלגוריתם החזיר פתרון אופטימאלי. 3
הוכחת טענת העזר: באינדוקציה שלמה על הקודקודים לפי סדר הופעתם במיון הטופולוגי. v 1 עבור בסיס: הקודקוד הראשון בסידור הטופולוגי- האלגוריתם מאתחל אבחנה 1 לא משתנה ערך זה בהמשך הריצה. מכיוון שבכל סידור חוקי כלשהי 1 הטענה מתקיימת. הנחה: נניח כי הטענה מתקיימת עבור כל קודקוד המופיע לפני הקודקוד line[ v ] 1 1 v 1. יושב ולפי בשורה בסידור, ונוכיח עבור צעד: יהי P סידור חוקי כלשהו אשר מושיב את נחלק לשני מקרים: לא קיימת צלע נכנסת ל- בשורה. line[ ] l. נראה כי l ערך ל-[ [ line מקודקוד כלשהו בגרף. לכן, השלב היחידי באלגוריתם בו יוכנס הוא שלב האתחול, וערך זה הוא 1. לכן בהכרח. 1 line[ v ] l קיימת צלע נכנסת ל- כך שערך line[ v'] האלגוריתם מחשב את ערך מקודקוד כלשהו בגרף. נסמן ב- ' v j j את קודקוד ממנו יוצאת צלע ל-. v' max arg line[ מקסימאלי. כלומר: v ]: ( v, v ) E v j V [ ] line ע"י בחירת הערך המקסימאלי מבין כל ערכי - line[ v] 1 עבור כל קודקוד v ממנו יוצאת צלע ל-,.]1[ line[ v ] line[ v '] 1 בהכרח לפני ' l נסמן ב- את השורה בה יושב ולכן מתקיים כי בסוף האלגוריתם v ' ]3[. מכאן נובע כי בסידור הטופולוגי 'l אזי l ב- P. ]2[, ומהנחת האינדוקציה נובע כי כיוון ש- ' v מופיע line[ v'] l'. line[ v ] line[ v'] 1 l' 1 l [1] [3] [2] * שאלה למחשבה: במידה וקיים סידור חוקי של תלמידי הכיתה, האם הוא בהכרח יחיד? 4
רכיבים קשירים היטב בגרף מכוון יהי (E (,V גרף מכוון. נגדיר את היחס R על קבוצת קודקודי הגרף המסמל "קשירות חזקה" באופן הבא: ( x, y) R אם קיים מסלול מ- x ל- y וגם קיים מסלול מ- y ל- x בגרף. ניתן להראות )בקלות( כי יחס זה הוא רפלקסיבי )אם מגדירים מסלול באורך 0 כמסלול מקודקוד לעצמו(, טרנזיטיבי וסימטרי, ולכן יחס שקילות. *תזכורת: חלוקה של קבוצה היא פרוק של הקבוצה לתת קבוצות זרות שאיחודן הוא הקבוצה כולה. יחס שקילות על קבוצה מגדיר חלוקה שלה, כך שכל תת קבוצה בחלוקה נקראת מחלקת שקילות, כל שני איברים באותה מחלקת שקילות עומדים ביחס, ואילו כל שני איברים ממחלקות שקילות שונות אינם עומדים ביחס. במקרה זה, R מגדיר חלוקה של V. כל מחלקת שקילות של היחס R נקראת "רכיב קשיר היטב" של הגרף, כאשר המשמעות היא שמכל קודקוד ברכיב קשיר היטב קיים מסלול לכל קודקוד אחר באותו הרכיב. הערה: בגרף מכוון, אין משמעות למושג קשירות שראינו בגרפים לא מכוונים אלא רק לקשירות היטב. למשל, בגרף הבא אין משמעות למשפט "הקודקודים הקיצונים קשירים", לעומת זאת, ניתן להגיד שבגרף התשתית המתאים, כלומר, בגרף המתקבל אחרי הורדת ה כיוונים של הקשתות, "הקודקודים הקיצונים קשירים". עתה נגדיר את גרף הרכיבים קשירים היטב של הגרף קודקודי )גרף מכוון(: הם הרכיבים הקשירים היטב של )מחלקות השקילות של היחס R(. קיימת צלע מקודקוד X לקודקוד Y ב- אם קיים קודקוד x ב- ברכיב המתאים ל- X וקודקוד ב-. ל- y שיש צלע מ- x כך ברכיב המתאים ל- Y, y באופן כללי, גרף רכיבי הקשירות הבא יתכן: הוא גרף מכוון חסר מעגלים, אך לא בהכרח עץ. הגרף 5
x Y X טענה 1: אם ק יים ב- מסלול מרכיב ברכיב X לכל קודקוד y ברכיב Y. הסבר )בציור(: Y לרכיב אזי קיים ב- מסלול מכל קודקוד X..... x y הערה: טענה 1 נכונה גם בכיוון ההפוך. נמקו! טענה 2: הגרף הוא גרף חסר מעגלים. הוכחה: נניח בשלילה כי קיים מעגל, ויהיו X ו- Y שני קודקודים שונים הנמצאים על המעגל. יהיו x ו- y קודקודים כלשהם מהרכיבים המתאימים ל- X ו- Y ב- בהתאמה. לפי ההנחה יש מסלול ב- מ- X ל- Y ולהיפך, ולכן, לפי טענה 1, יש מסלול ב- מ- x אל y ולהיפך. אזי x ו- y הם באותו רכיב קשירות, בסתירה לעובדה ש X ו- Y הם רכיבים שונים. בעיה )לקוחה ממועד א 2000(: יהי (E (,V גרף מכוון, שבו לכל קודקוד u V מותאם מספר.rating(u) נגדיר פונקציה: {קיים מסלול מ- u ל- v ב- best( (u max{rating( :(v v V, u V best( u) הראו כיצד ניתן לחשב גרף כללי. בזמן ליניארי את לכל עבור א. גרף חסר מעגלים, ב. עבור א. חסר מעגלים רעיון: נמיין את מיון טופולוגי )"גרף מכוון חסר מעגלים מהסוף להתחלה את שדות ה- best של הקדקודים. קיים מיון טופולוגי"(, ואז נעדכן האלגוריתם: אתחול: לכל קודקוד u נבצע: rating(u) best(u).1 נבצע מיון טופולוגי לקודקודי. 2. )כלומר, נעבור על רשימת הקדקודים הממוינת בסדר הפוך למיון הטופולוגי 3. ללא צלעות יוצאות(, ולכל קדקוד u נבצע: לכל v שכן של (u,v) ( u צלע בגרף( נבצע: אם best(v) best(u) < אז נעדכן best(v).best(u) נתחיל מקדקוד הסבר על נכונות האלגוריתם: כל פעם שנגיע לטפל בקדקוד חדש u בצעד 3 באלגוריתם, ערכי best(v) לכל v שאחרי u במיון הטופולוגי נכונים. ההוכחה באינדוקציה ונובעת מנכונות המיון הט ופולוגי )לא קיים מסלול מ- u לקדקוד שקודם לו במיון הטופולוגי ולכן לא יכול לתרום לערך ה- best של u ובאלגוריתם אנו מעדכנים את השדות של הקודקודים לפי סידורם במיון הטופולוגי מהסוף להתחלה(. 6
, ניתוח זמן ריצה:.1 אתחול: ) V.O(.2 מיון טופולוגי: ) E. O( V 3. בשלב האחרון עוברים בדיוק פעם אחת על כל קודקוד בגרף ופעם אחת על כל צלע בגרף ולכן ) E. O( V בסך הכל, זמן הריצה הוא ) E. O( V ב. גרף כללי.1 בסעיף זה מותר לנו להשתמש באלגוריתם למציאת רכיבים קשירים היטב בגרף מכוון, ובעובדה שגרף הרכיבים הוא חסר מעגלים. רעיון: נמצא את גרף הרכיבים קשירים היטב של. כעת יהיה לנו גרף חסר מעגלים ונוכל להפעיל את האלגוריתם מהסעיף הקודם )"גרף כללי מיון טופולוגי של גרף הרכיבים קשירים היטב"(, נשים לב שלכל הקדקודים ברכיב קשיר היטב אותו ערך של.best האלגוריתם: נבנה את.2.3.4 גרף הרכיבים קשירים היטב של. נאתחל את השדה rating של כל קדקוד C ב- ל- rating המקסימאלי של קדקודי הרכיב המתאים ב- :. rating( C) max{rating( u): u C} נפעיל את האלגוריתם מסעיף א על, כדי לקבל best(c) לכל רכיב C. לכל רכיב C ולכל u C נבצע best(c).best(u) הסבר על נכונות האלגוריתם: נשים לב כי קבוצת הקדקודים שניתן להגיע אליהם מכל אחד מהקדקודים הנמצאים באותו רכ יב קשיר היטב זהה )אם ניתן להגיע לקודקוד u מקודקוד x, אזי ניתן להגיע לקודקוד u מכל קודקוד y ברכיב של x ע"י שרשור המסלול מ- y ל- x והמסלול מ- x ל- u (. לכן, ערכי ה- best של כל קדקודי רכיב קשיר היטב זהים, ומכיוון שב- הקודם. אתחול שדות ה- rating של קדקודי לסיכום: יש מסלול מקדקוד u1 C 1 אין מעגלים ניתן להפעיל עליו את האלגוריתם מהסעיף מבטיח את קבלת התוצאות הנכונות. לקדקוד u2 C 2 בגרף אם"ם יש מסלול מ- C 2 ל- C 1. best( u ) best( C ) 1 1. לכן ב- ניתוח זמן ריצה:.1 בניית גרף הרכיבים קשרים היטב: ) E. O( V.2 ניתן לעדכן ב- ) V O( את שדות ה- rating ב-..3 הרצת האלגוריתם לגרף חסר מעגלים O( V E ) :.4 סה"כ זמן ריצה: הרכיבים יש לכל היותר V קודקודים ולכל היותר E צלעות(. השמת הערכים עבור קודקודי :.O( V ). O( V E ) )נשים לב כי בגרף 7